package com.husd.framework.autocode.dto;

import lombok.Data;

import java.util.List;
import java.util.Objects;

/**
 * xml只有一个root
 *
 * @author shengdonghu@126.com
 * @date 2023/4/23 09:50
 */
@Data
public class XmlDefine {

    /**
     * root元素的名字
     */
    private String name;

    /**
     * 元素的类型
     */
    private XmlDefineType type;

    /**
     * 元素的值 只有元素的类型是复合类型的时候，才没有值 是空的
     */
    private String value;

    /**
     * 属性元素
     */
    private List<XmlAttrDefine> attrList;

    /**
     * 子元素
     */
    private List<XmlDefine> elementList;

    /**
     * 表示这个元素是否可以重复 true表示可以填写多个值
     */
    private boolean repeat;

    private XmlDefine parentXmlDefine;

    private String path;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        XmlDefine xmlDefine = (XmlDefine) o;
        return Objects.equals(name, xmlDefine.name)
                && type == xmlDefine.type
                && Objects.equals(value, xmlDefine.value)
                && Objects.equals(attrList, xmlDefine.attrList)
                && Objects.equals(elementList, xmlDefine.elementList);
    }

    public void setRepeat(boolean repeat) {
        // 只可以从false 修改为true 不可以从true修改为false
        if(repeat == false) {
            return;
        }
        this.repeat = repeat;
    }

    public enum XmlDefineType {

        COMPLEX("", ""),
        STRING("String", "String"),
        BOOLEAN("Boolean", "Boolean"),
        BYTE("Byte", "Byte"),
        CHAR("Char", "Char"),
        SHORT("Short", "Short"),
        INT("Integer", "Integer"),
        LONG("Long", "Long"),
        FLOAT("Float", "BigDecimal"),
        DOUBLE("Double", "BigDecimal"),
        TIME("Time", "String"),
        DAYSCODETYPE("DAYSCODETYPE", "String");


        private String name;
        private String type;

        XmlDefineType(String name, String type) {
            this.name = name;
            this.type = type;
        }

        public String getName() {
            return name;
        }

        public String getType() {
            return type;
        }
    }

    @Data
    public static class XmlAttrDefine {

        private String name;
        private String value;
    }
}
